/*
 * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package javax.management;

// java import

import java.io.Serializable;

// RI import
import javax.management.ObjectName;


/**
 * Used to represent the object name of an MBean and its class name.
 * If the MBean is a Dynamic MBean the class name should be retrieved from
 * the <CODE>MBeanInfo</CODE> it provides.
 *
 * @since 1.5
 */
public class ObjectInstance implements Serializable {


  /* Serial version */
  private static final long serialVersionUID = -4099952623687795850L;

  /**
   * @serial Object name.
   */
  private ObjectName name;

  /**
   * @serial Class name.
   */
  private String className;

  /**
   * Allows an object instance to be created given a string representation of
   * an object name and the full class name, including the package name.
   *
   * @param objectName A string representation of the object name.
   * @param className The full class name, including the package name, of the object instance.  If
   * the MBean is a Dynamic MBean the class name corresponds to its {@link
   * DynamicMBean#getMBeanInfo() getMBeanInfo()}<code>.getClassName()</code>.
   * @throws MalformedObjectNameException The string passed as a parameter does not have the right
   * format.
   */
  public ObjectInstance(String objectName, String className)
      throws MalformedObjectNameException {
    this(new ObjectName(objectName), className);
  }

  /**
   * Allows an object instance to be created given an object name and
   * the full class name, including the package name.
   *
   * @param objectName The object name.
   * @param className The full class name, including the package name, of the object instance.  If
   * the MBean is a Dynamic MBean the class name corresponds to its {@link
   * DynamicMBean#getMBeanInfo() getMBeanInfo()}<code>.getClassName()</code>. If the MBean is a
   * Dynamic MBean the class name should be retrieved from the <CODE>MBeanInfo</CODE> it provides.
   */
  public ObjectInstance(ObjectName objectName, String className) {
    if (objectName.isPattern()) {
      final IllegalArgumentException iae =
          new IllegalArgumentException("Invalid name->" +
              objectName.toString());
      throw new RuntimeOperationsException(iae);
    }
    this.name = objectName;
    this.className = className;
  }


  /**
   * Compares the current object instance with another object instance.
   *
   * @param object The object instance that the current object instance is to be compared with.
   * @return True if the two object instances are equal, otherwise false.
   */
  public boolean equals(Object object) {
    if (!(object instanceof ObjectInstance)) {
      return false;
    }
    ObjectInstance val = (ObjectInstance) object;
    if (!name.equals(val.getObjectName())) {
      return false;
    }
    if (className == null) {
      return (val.getClassName() == null);
    }
    return className.equals(val.getClassName());
  }

  public int hashCode() {
    final int classHash = ((className == null) ? 0 : className.hashCode());
    return name.hashCode() ^ classHash;
  }

  /**
   * Returns the object name part.
   *
   * @return the object name.
   */
  public ObjectName getObjectName() {
    return name;
  }

  /**
   * Returns the class part.
   *
   * @return the class name.
   */
  public String getClassName() {
    return className;
  }

  /**
   * Returns a string representing this ObjectInstance object. The format of this string
   * is not specified, but users can expect that two ObjectInstances return the same
   * string if and only if they are equal.
   */
  public String toString() {
    return getClassName() + "[" + getObjectName() + "]";
  }
}
